// internal/apps/auth/manager/user_manager.go
package manager

import (
	"errors"
	"star-go-app/internal/apps/auth/models"
	"strings"

	"golang.org/x/crypto/bcrypt"
)

// UserDomain 用户领域服务
type UserDomain struct{}

// NewUserDomain 创建用户领域服务
func NewUserDomain() *UserDomain {
	return &UserDomain{}
}

// SetPassword 设置用户密码 - 使用bcrypt加密
func (ud *UserDomain) SetPassword(user *models.User, password string) error {
	if len(password) == 0 {
		return errors.New("密码不能为空")
	}

	hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	if err != nil {
		return err
	}

	user.Password = string(hashedPassword)
	return nil
}

// CheckPassword 验证用户密码
func (ud *UserDomain) CheckPassword(user *models.User, password string) bool {
	err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password))
	return err == nil
}

// ValidateUserData 验证用户数据
func (ud *UserDomain) ValidateUserData(username, email string) error {
	if len(username) < 3 || len(username) > 20 {
		return errors.New("用户名长度必须在3-20个字符之间")
	}

	if len(email) == 0 {
		return errors.New("邮箱不能为空")
	}

	// 这里可以添加更多的验证逻辑
	return nil
}

// HasPermission 检查用户是否有特定权限
func (ud *UserDomain) HasPermission(user *models.User, resource, action string) bool {
	if user.Role == nil {
		return false
	}

	permissionToCheck := resource + ":" + action

	// 检查是否有全部权限
	for _, perm := range user.Role.Permissions {
		if perm == models.PermAll {
			return true
		}
		if perm == permissionToCheck {
			return true
		}
	}

	return false
}

// IsAdmin 检查用户是否是管理员
func (ud *UserDomain) IsAdmin(user *models.User) bool {
	if user.Role == nil {
		return false
	}

	// 通过角色编码判断是否是管理员
	return user.Role.Code == models.RoleAdmin || user.IsSuperuser
}

// GetUserPermissions 获取用户的所有权限
func (ud *UserDomain) GetUserPermissions(user *models.User) []Permission {
	if user.Role == nil {
		return []Permission{}
	}

	var permissions []Permission
	for _, perm := range user.Role.Permissions {
		// 如果是全部权限，则不解析具体权限
		if perm == models.PermAll {
			permissions = append(permissions, Permission{
				Resource: "*",
				Action:   "*",
			})
			continue
		}

		// 解析权限格式 resource:action
		parts := strings.Split(perm, ":")
		if len(parts) == 2 {
			permissions = append(permissions, Permission{
				Resource: parts[0],
				Action:   parts[1],
			})
		}
	}

	return permissions
}

// CanAccessResource 检查用户是否可以访问特定资源
func (ud *UserDomain) CanAccessResource(user *models.User, resource string) bool {
	if user.Role == nil {
		return false
	}

	// 检查是否有全部权限
	for _, perm := range user.Role.Permissions {
		if perm == models.PermAll {
			return true
		}
		// 检查是否有该资源的任何权限
		if strings.HasPrefix(perm, resource+":") {
			return true
		}
	}

	return false
}

// Permission 权限结构体
type Permission struct {
	Resource string `json:"resource"`
	Action   string `json:"action"`
}
